package com.thinkgsp.jxc.persistence;

import java.util.List;

import org.apache.ibatis.annotations.Select;

import com.thinkgsp.jxc.model.Product;
import com.thinkgsp.jxc.model.ProductBusProperties;
import com.thinkgsp.jxc.model.ProductClassify;
import com.thinkgsp.jxc.model.ProductLogisticsProperties;
import com.thinkgsp.jxc.model.ProductManuf;
import com.thinkgsp.jxc.model.ProductMedicineProperties;

/**
 * Product 类的Dao Product 类以及其属性、产品生产企业、产品分类的CRUD
 * @author evan
 *
 */
public interface ProductMapper {

	/**
	 * 获取一个产品,本方法不包含扩展属性的加载
	 * @param productId 产品Id
	 * @return
	 */
	public Product getProduct(Integer productId);
	
	/**
	 * 获取一个商品，本方法包含所有扩展属性
	 * @param productId
	 * @return
	 */
	public Product getAllPropertiesProduct(Integer productId);
	
	/**
	 * 获取所有已删除的产品
	 * @return
	 */
	public List<Product> getDeletedProducts();
	
	/**
	 * 插入一个产品对象
	 * @param product
	 */
	public void insertProduct(Product product);
	
	/**
	 * 修改一个产品对象,不修改属性(productId,deleted)
	 * @param product
	 */
	public int updateProduct(Product product);
	
	/**
	 * 禁用产品对象，不实际删除对象，只是修改deleted属性为false
	 * @param productId
	 */
	public int disableProduct(Integer productId);
	
	/**
	 * 启用商品,将deleted属性设为true
	 * @param productId
	 * @return
	 */
	public int enableProduct(Integer productId);
	
	/**
	 * 获取产品的业务属性
	 * @param productId
	 * @return
	 */
	public ProductBusProperties getProductBusProperties(Integer productId);
	/**
	 * 插入商业属性
	 * @param busProperties
	 */
	public void insertBusProperties(ProductBusProperties busProperties);
	
	/**
	 * 修改商业属性
	 * @param busProperties
	 */
	public int updateBusProperties(ProductBusProperties busProperties);
	
	/**
	 * 获取产品的物流属性
	 * @param productId
	 * @return
	 */
	//public ProductLogisticsProperties getProductLogisticsProperties(Integer productId);
	
	/**
	 * 插入物流属性
	 * @param logisticsProperties
	 */
	//public void insertLogisticsProperties(ProductLogisticsProperties logisticsProperties);
	
	/**
	 * 修改物流属性
	 * @param logisticsProperties
	 */
	//public void updateLogisticsProperties(ProductLogisticsProperties logisticsProperties);
	
	/**
	 * 获取产品的药物属性
	 * @param productId
	 * @return
	 */
	public ProductMedicineProperties getProductMedicineProperties(Integer productId);
	
	/**
	 * 插入药物属性
	 * @param medicineProperties
	 */
	public void insertMedicineProperties(ProductMedicineProperties medicineProperties);
	
	/**
	 * 修改药物属性
	 * @param medicineProperties
	 */
	public int updateMedicineProperties(ProductMedicineProperties medicineProperties);
	
	/**
	 * 获取产品的物流属性
	 * @param productId
	 * @return
	 */
	public ProductLogisticsProperties getLogisticsProperties(Integer productId);
	
	/**
	 * 插入产品的物流属性
	 * @param logisticsProperties
	 */
	public void insertLogisticsProperties(ProductLogisticsProperties logisticsProperties);
	
	/**
	 * 修改产品的物流属性
	 * @param logisticsProperties
	 * @return
	 */
	public int updateLogisticsProperties(ProductLogisticsProperties logisticsProperties);
	
	/**
	 * 获取产品分类
	 * @param classifyId
	 * @return
	 */
	public ProductClassify getClassify(Integer classifyId);
	
	/**
	 * 根据上级ID检索产品分类
	 * @param parentId
	 * @return
	 */
	public List<ProductClassify> getClassifyChilds(Integer parentId);
	
	/**
	 * 插入一个新的产品分类信息
	 * @param classify
	 */
	public void insertClassify(ProductClassify classify);
	
	/**
	 * 修改产品分类信息
	 * @param classify
	 */
	public int updateClassify(ProductClassify classify);
	
	/**
	 * 删除产品分类信息
	 * @param classifyId
	 */
	public int deleteClassify(Integer classifyId);
	
	/**
	 * 获取所有的产品生产企业
	 * @return
	 */
	public List<ProductManuf> getAllManuf();
	
	/**
	 * 获取一个生产企业
	 * @param manufId
	 */
	public ProductManuf getManuf(Integer manufId);
	
	/**
	 * 搜索产品生产企业
	 * @param val 查询条件
	 * @return
	 */
	public List<ProductManuf> searchManuf(String val);
	/**
	 * 插入新的生产企业
	 * @param manuf
	 */
	public void insertManuf(ProductManuf manuf);
	
	/**
	 * 修改生产企业
	 * @param manuf
	 */
	public int updateManuf(ProductManuf manuf);
	
	/**
	 * 删除生产企业
	 * @param manufId
	 */
	public int deleteManuf(Integer manufId);
	
	/**
	 * 搜索产品信息
	 * @param val 参数搜索范围:产品编码、产品名称、商品名、条码
	 * 	高级搜索：
	 * @return 产品列表
	 */
	public List<Product> searchProduct(String val);
	
	/**
	 * 查询属于某一生产企业的所有商品
	 * @param manufId
	 * @return
	 */
	public List<Product> getProductByManufId(int manufId);
	
	/**
	 * 查询某一分类的所有商品
	 * @param classifyid
	 * @return
	 */
	public List<Product> getProductByClassifyId(int classifyid);
	
	/**
	 * 根据产品编码检索产品
	 * @param code
	 * @return
	 */
	public Product findProductByCode(String code);
	
	/**
	 * 获取汉字的拼音首字母
	 * @param chs
	 * @return
	 */
	@Select("select CONVERT_PY(#{chs});")
	public String convertChineseToPinYin(String chs);
}
